﻿#coding=utf-8

'''
程 序 名：游民星空图片爬虫
编 写 人：bxgj
运行环境：win7x64 Python3.6.4
修改日志：2018.02.27 新建，成功爬取一页图片
          2018.02.28 继续完善，成功爬取所有图片，但需进行适当整理
版    本：v0.1
备    注：
目前仅完成基本爬虫功能，图片标题中如果有特殊字符会导致保存出错
壁纸版块现在爬出来的是缩略图，以后完善爬高清大图
'''

from bs4 import BeautifulSoup
import requests
import time
import os

# 要爬取的链接
url = "http://www.gamersky.com/ent/201802/1019051_9.shtml"

# 保存路径，
save_path = "C:\\gamersky\\"

# 路径合法性检查，不存在则创建
if (os.path.exists(save_path) == False):
    os.makedirs(save_path)

# 检查是否有下一页
def NextPage(soup):
    # 找到放链接的div
    next_url = soup.select(".page_css > a")
    for tag in next_url:
        text = tag.get_text()
        if (text.find("下一页") >= 0):
            link = tag.get("href")
            return link
    return None

# 将指定的图片（链接）以指定名称（含后缀名）保存到本地
def SaveImg(url, name):
    img = requests.get(url)
    img_name = save_path + name
    with open(img_name, 'wb') as img_file:
        img_file.write(img.content)
        print("保存图片",img_name)

# 获取某一页中的图片标题及链接
def GetImgInfo(soup):
    # 获取图片链接
    image_link = soup.select(".picact")
    # 这里是判断列表为空的一个技巧，空列表为False，这里直接用布尔逻辑判断即可
    # 不能用image_link == None或image_link[0] == None
    if (not image_link):
        print("解析失败")
        return

    # 获取图片标题
    image_title = soup.select('p[align="center"]')

    # 构建字典，用于保存图片信息
    img_info_dic = {}

    for link, title in zip(image_link, image_title):
        # 获取图片链接
        img_url = link.get("src")

        # 获取图片名
        # img_name = title.get_text()
        # img_name = img_name.strip('\r\n\t ') # 删除换行、回车、tab、空格
        img_name = title.get_text()
        img_name = "".join(img_name.split()) # 先分片，再合并是一种去掉包括\xa0等特殊空白字符的方法
        # print(img_name)

        # 处理链接及图片名
        # 如果没有标题，就使用原始文件名
        if (len(img_name) == 0):
            pos = img_url.rfind('/')
            img_name = img_url[pos+1:]
        # 否则使用标题+扩展名
        else:
            pos = img_url.rfind('.')
            filename_extension = img_url[pos:]
            img_name = img_name + filename_extension

        # 保存图片链接及图片名
        img_info_dic[img_url] = img_name

    # 爬取本页的图片
    for key in img_info_dic:
        # print(key+':'+img_info_dic[key])
        SaveImg(key, img_info_dic[key])

# 这里就正式开始爬了
tmp_url = url
page_count = 0
while (True):
    page_count += 1
    print("第",page_count,"页")
    # request发起请求
    web_data = requests.get(tmp_url)
    # 如果得到的文字是乱码，在这里指定编码方式
    web_data.encoding='utf-8'
    # 使用text方法获取正文内容
    soup = BeautifulSoup(web_data.text, "lxml")
    # 爬图
    GetImgInfo(soup)
    # 检查下一页
    tmp_url = NextPage(soup)
    if (tmp_url == None):
        print("完成")
        break
    # 适当延时
    time.sleep(3)
